/* 
 * File:   Servidor.cpp
 * Author: max
 * 
 * Created on October 19, 2012, 12:31 AM
 */

#include "server_Servidor.h"
using namespace TP::Comunicacion;

Servidor::Servidor(const string& pPuerto, const string& pVulnerabilidadesDataPath, const string& pVulnerabilidadesDefinicionesDataPath){
    
    this->conexion = new Conexion (pPuerto, this);
    this->vulnerabilidades = new VulnerabilidadService( pVulnerabilidadesDataPath, pVulnerabilidadesDefinicionesDataPath);
}

Servidor::~Servidor() {
    
    // Doy de baja la conexion.
    if (this->conexion)
        delete this->conexion;
    
    // Doy de baja las vulnerabilidades.
    if (this->vulnerabilidades)
        delete this->vulnerabilidades;
}

void Servidor::Iniciar() throw (Excepcion&){
    try
    {
        this->vulnerabilidades->Iniciar();
        this->conexion->Iniciar();
    }
    catch (Excepcion& pEx)
    {
        pEx.expandirMensaje("No se puede iniciar el sevidor.");
        throw;
    }
}

void Servidor::Finalizar() throw (Excepcion&){
    try
    {
        // Doy de baja las sesiones activas.
        for (vector<Sesion*>::iterator it = this->sesiones.begin(); it != this->sesiones.end(); it++)
        {
            Sesion* aux = (Sesion*) *it;
            aux->Finalizar();
            delete aux;
        }
        this->sesiones.clear();
        
        this->conexion->Finalizar();
        this->vulnerabilidades->Finalizar();
    }
    catch (Excepcion& pEx)
    {
        pEx.expandirMensaje("No se puede finializar el sevidor.");
        throw;
    }
}

void Servidor::eventoNuevaSesion (IEnviante* pEnviante, void* pArg){
    
    Sesion* sesion = (Sesion*) pArg;
    
    try
    {
        if (sesion)
        {
            // Se configuran los manejadores de mensaje de la sesion.
            sesion->agregarManejadorSesionEvento(this);
            sesion->agregarMensajeEntranteManejador((IMensajeEntranteManejador*)this->vulnerabilidades);
            
            // Se debe iniciar la escucha de mensajes de la sesion.
            sesion->Iniciar();
            
            // Se debe registrar la sesion en la lista de sesiones del servidor.
            this->sesiones.push_back(sesion);
        }
    }
    catch (Excepcion& pEx)
    {
        std::cout << "No se puede manejar la nueva sesion.  " << pEx.what() << endl;
    }
}

void Servidor::eventoErrorComunicacion (IEnviante* pEnviante, const string& pMensaje ){
    cerr << pMensaje << endl;
}

void Servidor::eventoConexionFinalizada (IEnviante* pEnviante, const string& pMensaje){
    cerr << pMensaje << endl;
}

void Servidor::eventoErrorConexionInexistente (IEnviante* pConexion, const string& pMensaje) {
    cerr << pMensaje << endl;
    
}